import { useMemberStore } from "@/stores/modules/member";
import { useToastStore } from "@/stores/modules/toast";

/**请求基地址**/
//http://192.168.110.249/ck2  2.0
//https://focusgenes.com/ck2 远程
let baseIP = "192.168.110.249";
export let baseURL = "http://" + baseIP + "/fieldmedical";
export const setBaseURLIp = (ip: string) => {
  baseIP = ip;
  baseURL = "http://" + baseIP + "/fieldmedical";
  // console.log("baseURL", baseURL);
};
// 请求方法以及拦截器配置
// 请求拦截器配置
const httpInterceptor = {
  // 拦截前触发
  invoke(options: UniApp.RequestOptions) {
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith("http")) {
      options.url = baseURL + options.url;
    }
    // 2. 请求超时
    options.timeout = 10000;
    options.header = {};
    // console.log("请求信息：", options);

    // 4. 添加 token 请求头标识
    const memberStore = useMemberStore();
    const token = memberStore?.token;
    if (token) {
      options.header.token = token;
    }
  },
};

// 请求拦截 request 请求
uni.addInterceptor("request", httpInterceptor);
// 请求拦截 uploadFile 文件上传
uni.addInterceptor("uploadFile", httpInterceptor);

//请求封装
/**
 * 请求函数
 * @returns Promise
 *  1. 返回 Promise 对象，用于处理返回值类型
 *  2. 获取数据成功
 *    2.1 提取核心数据 res.data
 *    2.2 添加类型，支持泛型
 *  3. 获取数据失败
 *    3.1 401错误  -> 444444444444444444444444清理用户信息，跳转到登录页
 *    3.2 其他错误 -> 根据后端错误信息轻提示
 *    3.3 网络错误 -> 提示用户换网络
 */
type Data<T> = {
  code: number;
  msg: string;
  data?: any;
};

//请求返回错误处理
const showToastAndRedirect = (title: string, code?: number) => {
  uni.showToast({
    title,
    icon: "error",
  });

  //token过期
  if (code == 401) {
    setTimeout(() => {
      uni.reLaunch({
        url: "/pages/login/login",
      });
    }, 1000);
  }
};
// 2.2 添加类型，支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {
  const useToast = useToastStore();
  //默认请求方法为POST
  if (!options.method) {
    options.method = "POST";
  }
  return new Promise<Data<T>>((resolve, reject) => {
    uni.request({
      ...options,
      success(res: any) {
        if (res.statusCode == 200) {
          const data = res.data as Data<T>;
          // console.log("网络请求成功，返回数据：", data);
          if (data.code === 401 || data.code === 10021) {
            showToastAndRedirect("登陆过期！", 401);
          } else if (data.code !== 0) {
            useToast.show = true;
            useToast.title = data.msg;
            useToast.type = false;
            showToastAndRedirect(data.msg);
            reject(data.msg);
          } else {
            resolve(data);
          }
        } else {
          showToastAndRedirect(res.data.error);
          reject(res.data.error);
        }
      },
      fail(err) {
        useToast.show = true;
        useToast.title = err.errMsg;
        showToastAndRedirect("网络错误");
        reject(err);
      },
    });
  });
};
